import java.util.PriorityQueue;

class Solution {

    // 优化后的暴力枚举
    public static int minSubArrayLen(int target, int[] nums) {
        int left = 0;
        int right = 0;
        int sum = 0;
        PriorityQueue<Integer> minHeap = new PriorityQueue<>();
        while (right < nums.length) {
            sum += nums[right];
            // 满足条件，就一直更新并缩小窗口
            while (sum >= target) {
                minHeap.add(right-left+1);
                sum -= nums[left++];
            }
            // 走到这里说明sum < target
            right++;
        }
        return minHeap.isEmpty() ? 0 : minHeap.peek();
    }

    // 使用滑动窗口算法来进行优化
    /*public static int minSubArrayLen(int target, int[] nums) {
        int left = 0;
        int right = 0;
        int sum = 0;
        // 由于要比较找到最小值，因此这个数不能为0，要设为不会干扰的数据
        int len = Integer.MAX_VALUE;
        while (right < nums.length) {
            sum += nums[right];
            // 可能不只是判断判断一次
            while (sum >= target) {
                int new_len = right-left+1;
                len = Math.min(len, new_len);
                if (len == 1) {
                    return len;
                }
                sum -= nums[left++];
            }
            // 走到这里说明此时<target
            right++;
        }
        return len;
    }*/

    public static void main(String[] args) {
        int[] nums = {1,4,4};
        int len = minSubArrayLen(4,nums);
    }
}